#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_errno.h"
#include "iot_pwm.h"
#include "hi_pwm.h"
#include "hi_time.h"

/* 硬件定义 */
#define LED_GPIO         10    // LED控制引脚
#define SENSOR_GPIO      12    // 倾斜传感器引脚
#define BUZZER_PWM_PORT  HI_PWM_PORT_PWM2  // 蜂鸣器使用PWM2
#define BUZZER_GPIO      11    // 蜂鸣器控制引脚(PWM2对应GPIO11)

/* 状态定义 */
enum {
    LED_OFF = 1,
    LED_ON = 0,
    SENSOR_ACTIVE = 1,
    SENSOR_INACTIVE = 0
};

/* 音符频率表(基于40MHz时钟计算) */
static const uint16_t g_tuneFreqs[] = {
    0,
    38223, // 1 1046.5Hz
    34052, // 2 1174.7Hz
    30338, // 3 1318.5Hz
    28635, // 4 1396.4Hz
    25511, // 5 1568Hz
    22728, // 6 1760Hz
    20249, // 7 1975.5Hz
    51021, // 8,5_低音 783.99Hz
    45454, // 9,6_ 880.00Hz
    40495, // 10,7_ 987.77Hz
};

/* 《小星星》简谱 */
static const uint8_t g_scoreNotes[] = {
    1,1,5,5, 6,6,5, 4,4,3,3, 2,2,1,
    5,5,4,4, 3,3,2, 5,5,4,4, 3,3,2,
};

/* 曲谱时值 */
static const uint8_t g_scoreDurations[] = {
    4,4,4,4, 4,4,4,8, 4,4,4,4, 4,4,4,8,
    4,4,4,4, 4,4,4,8, 4,4,4,4, 4,4,4,8,
};

/* 蜂鸣器初始化 */
static void BuzzerInit(void)
{
    // 配置GPIO11为PWM2功能
    hi_io_set_func(HI_IO_NAME_GPIO_11, HI_IO_FUNC_GPIO_11_PWM2_OUT);
    hi_io_set_pull(HI_IO_NAME_GPIO_11, HI_IO_PULL_UP);
    
    // 初始化PWM并明确使用40MHz时钟
    hi_pwm_init(BUZZER_PWM_PORT);
    hi_pwm_set_clock(PWM_CLK_XTAL);  // 使用外部晶振(40MHz)
}

/* 播放音乐片段 */
static void PlayMusicSegment(void)
{
    uint32_t tune;
    uint16_t freqDivisor;
    uint32_t tuneInterval;

    for(size_t i = 0; i < sizeof(g_scoreNotes)/sizeof(g_scoreNotes[0])/2; i++) {
        tune = g_scoreNotes[i];
        freqDivisor = g_tuneFreqs[tune];
        tuneInterval = g_scoreDurations[i] * (125 * 1000);  // 音符持续时间
        
        // 启动PWM输出(基于40MHz时钟分频)
        hi_pwm_start(BUZZER_PWM_PORT, freqDivisor/2, freqDivisor);
        hi_udelay(tuneInterval);
        hi_pwm_stop(BUZZER_PWM_PORT);
    }
}

/* 硬件初始化 */
static void HardwareInit(void)
{
    // LED初始化
    IoTGpioInit(LED_GPIO);
    hi_io_set_func(LED_GPIO, HI_IO_FUNC_GPIO_10_GPIO);
    IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
    hi_io_set_pull(LED_GPIO, HI_IO_PULL_UP);
    IoTGpioSetOutputVal(LED_GPIO, LED_OFF);

    // 倾斜传感器初始化
    IoTGpioInit(SENSOR_GPIO);
    hi_io_set_func(SENSOR_GPIO, HI_IO_FUNC_GPIO_12_GPIO);
    IoTGpioSetDir(SENSOR_GPIO, IOT_GPIO_DIR_IN);
    hi_io_set_pull(SENSOR_GPIO, HI_IO_PULL_UP);

    // 蜂鸣器初始化
    BuzzerInit();
}

/* 主任务 */
static void *MainTask(void *arg)
{
    (void)arg;
    unsigned char sensorState;
    
    while (1) {
        // 读取传感器状态
        IoTGpioGetInputVal(SENSOR_GPIO, &sensorState);
        printf("Sensor state: %d\n", sensorState);
        
        if(sensorState == SENSOR_ACTIVE) {
            // 倾斜状态 - 点亮LED并播放音乐
            IoTGpioSetOutputVal(LED_GPIO, LED_ON);
            PlayMusicSegment();
        } else {
            // 水平状态 - 关闭LED和蜂鸣器
            IoTGpioSetOutputVal(LED_GPIO, LED_OFF);
            hi_pwm_stop(BUZZER_PWM_PORT);
        }
        
        usleep(200000);  // 200ms检测间隔
    }
    
    return NULL;
}

/* 系统启动入口 */
static void AppEntry(void)
{
    osThreadAttr_t attr = {
        .name = "MainTask",
        .stack_size = 4096,
        .priority = osPriorityNormal,
    };

    // 硬件初始化
    HardwareInit();

    // 创建主任务
    if (osThreadNew(MainTask, NULL, &attr) == NULL) {
        printf("Failed to create main task!\n");
    }
}

// 系统运行入口
SYS_RUN(AppEntry);